/**
 * 根据 ECMAScript 规范，这个符号作为一个属性表示“一个正则表达式方法，
 * 该方法用正则表达式去匹配字符串。由 String.prototype.match()方法使用”。
 * String.prototype.match()方法会使用以 Symbol.match 为键的函数来对正则表达式求值。
 * 正则表达式的原型上默认有这个函数的定义，因此所有正则表达式实例默认是这个 String 方法的有效参数
 */
console.log(RegExp.prototype[Symbol.match]) // [Function: [Symbol.match]]
console.log('foobar'.match(/bar/)) // [ 'bar', index: 3, input: 'foobar', groups: undefined ]

/**
 * 给 match 方法传入非正则表达式值会导致该值被转换为 RegExp 对象。
 * 如果想改变这种行为，让方法直接使用参数，
 * 则可以重新定义 Symbol.match 函数以取代默认对正则表达式求值的行为，
 * 从而让match()方法使用非正则表达式实例。Symbol.match 函数接收一个参数，
 * 就是调用 match()方法的字符串实例。
 */
class FooMatcher {
  static [Symbol.match](target) {
    return target.includes('foo')
  }
}
console.log('foobar'.match(FooMatcher)) // true
console.log('barbaz'.match(FooMatcher)) // false
class StringMatcher {
  constructor(str) {
    this.str = str
  }
  [Symbol.match](target) {
    return target.includes(this.str)
  }
}
console.log('foobar'.match(new StringMatcher('foo'))) // true
console.log('barbaz'.match(new StringMatcher('qux'))) // false
